home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 24
/
Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso
/
Aminet
/
comm
/
mail
/
Mutt089src.lha
/
Mutt-0.89i-AMIGA
/
src
/
compose.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-01-28
|
20KB
|
808 lines
/*
* Copyright (C) 1996-8 Michael R. Elkins <me@cs.hmc.edu>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "mutt.h"
#include "mutt_curses.h"
#include "mutt_menu.h"
#include "send.h"
#include "rfc1524.h"
#include "mime.h"
#include "attach.h"
#include <string.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#define CHECK_COUNT if (idxlen == 0) { mutt_error ("There are no attachments."); break; }
#define HDR_TO 1
#define HDR_CC 2
#define HDR_BCC 3
#define HDR_SUBJECT 4
#define HDR_REPLYTO 5
#define HDR_FCC 6
#ifdef _PGPPATH
#define HDR_PGP 7
#endif
/* where to start printing the attachments */
#define HDR_ATTACH 10
#define HDR_XOFFSET 10
void snd_entry (char *b, size_t blen, MUTTMENU *menu, int num)
{
char t[SHORT_STRING], size[SHORT_STRING];
char tmp[_POSIX_PATH_MAX];
BODY *m;
ATTACHPTR **idx = (ATTACHPTR **) menu->data;
struct stat finfo;
m = idx[num]->content;
if (m->filename && m->filename[0])
{
if (stat (m->filename, &finfo) != -1)
mutt_pretty_size (size, sizeof (size), finfo.st_size);
else
strcpy (size, "0K");
strfcpy (tmp, m->filename, sizeof (tmp));
}
else
{
strcpy (size, "0K");
strcpy (tmp, "<no file>");
}
mutt_pretty_mailbox (tmp);
snprintf (t, sizeof (t), "[%.7s/%.10s, %.6s, %s]",
TYPE (m->type), m->subtype, ENCODING (m->encoding), size);
snprintf (b, blen, "%c%c%2d %-34.34s %s%s <%s>",
m->unlink ? '-' : ' ',
m->tagged ? '*' : ' ',
num + 1,
t,
idx[num]->tree ? idx[num]->tree : "",
tmp,
m->description ? m->description : "no description");
}
#ifdef _PGPPATH
#include "pgp.h"
static int pgp_send_menu (int bits)
{
int c;
char *p;
mvaddstr (LINES-1, 0, "(e)ncrypt, (s)ign, sign (a)s, (b)oth or (f)orget it? ");
clrtoeol ();
do
{
mutt_refresh ();
if ((c = mutt_getch ()) == ERR)
break;
if (c == 'a')
{
unset_option(OPTPGPCHECKTRUST);
if ((p = pgp_ask_for_key (PgpSecring, NULL, "Sign as: ", NULL, KEYFLAG_CANSIGN)))
{
snprintf (PgpSignAs, sizeof (PgpSignAs), "0x%s", p);
pgp_void_passphrase (); /* probably need a different passphrase */
free (p);
bits |= PGPSIGN;
}
}
else if (c == 'e')
bits |= PGPENCRYPT;
else if (c == 's')
bits |= PGPSIGN;
else if (c == 'b')
bits = PGPENCRYPT | PGPSIGN;
else if (c == 'f')
bits = 0;
else
{
BEEP ();
c = 0;
}
}
while (c == 0);
CLEARLINE (LINES-1);
mutt_refresh ();
return (bits);
}
#endif /* _PGPPATH */
static void draw_envelope (HEADER *msg, char *fcc)
{
char buf[STRING];
mvaddstr (HDR_TO, 0, " To: ");
buf[0] = 0;
rfc822_write_address (buf, sizeof (buf), msg->env->to);
printw ("%-*.*s", COLS-HDR_XOFFSET, COLS-HDR_XOFFSET, buf);
mvaddstr (HDR_CC, 0, " Cc: ");
buf[0] = 0;
rfc822_write_address (buf, sizeof (buf), msg->env->cc);
printw ("%-*.*s", COLS-HDR_XOFFSET, COLS-HDR_XOFFSET, buf);
mvaddstr (HDR_BCC, 0, " Bcc: ");
buf[0] = 0;
rfc822_write_address (buf, sizeof (buf), msg->env->bcc);
printw ("%-*.*s", COLS-HDR_XOFFSET, COLS-HDR_XOFFSET, buf);
mvaddstr (HDR_SUBJECT, 0, " Subject: ");
if (msg->env->subject)
printw ("%-*.*s", COLS-HDR_XOFFSET, COLS-HDR_XOFFSET, msg->env->subject);
else
clrtoeol ();
mvaddstr (HDR_REPLYTO, 0, "Reply-To: ");
if (msg->env->reply_to)
{
buf[0] = 0;
rfc822_write_address (buf, sizeof (buf), msg->env->reply_to);
printw ("%-*.*s", COLS - HDR_XOFFSET, COLS - HDR_XOFFSET, buf);
}
else
clrtoeol ();
mvaddstr (HDR_FCC, 0, " Fcc: ");
addstr (fcc);
#ifdef _PGPPATH
mvaddstr (HDR_PGP, 0, " PGP: ");
if ((msg->pgp & (PGPENCRYPT | PGPSIGN)) == (PGPENCRYPT | PGPSIGN))
addstr ("Sign, Encrypt");
else if (msg->pgp & PGPENCRYPT)
addstr ("Encrypt");
else if (msg->pgp & PGPSIGN)
{
addstr ("Sign");
if (PgpSignAs[0])
printw (" as %s", PgpSignAs);
}
else
addstr ("Clear");
clrtoeol ();
#endif /* _PGPPATH */
mvaddstr (HDR_ATTACH-1, 0, "===== Attachments =====");
}
static int edit_address_list (int line, ENVELOPE *env)
{
char buf[HUGE_STRING] = ""; /* needs to be large for alias expansion */
ADDRESS **addr;
char *prompt;
switch (line)
{
case HDR_TO:
prompt = "To: ";
addr = &env->to;
break;
case HDR_CC:
prompt = "Cc: ";
addr = &env->cc;
break;
case HDR_BCC:
prompt = "Bcc: ";
addr = &env->bcc;
break;
case HDR_REPLYTO:
prompt = "Reply-To: ";
addr = &env->reply_to;
break;
default:
return 0;
}
rfc822_write_address (buf, sizeof (buf), *addr);
if (mutt_get_field (prompt, buf, sizeof (buf), M_ALIAS) != 0)
return 0;
mutt_free_address (addr);
mutt_parse_adrlist (addr, buf, "@");
*addr = mutt_expand_aliases (*addr);
if (option (OPTNEEDREDRAW))
{
unset_option (OPTNEEDREDRAW);
return (REDRAW_FULL);
}
/* redraw the expanded list so the user can see the result */
buf[0] = 0;
rfc822_write_address (buf, sizeof (buf), *addr);
move (line, HDR_XOFFSET);
printw ("%-*.*s", COLS - HDR_XOFFSET, COLS - HDR_XOFFSET, buf);
return 0;
}
static int delete_attachment (MUTTMENU *menu, short *idxlen, int x)
{
ATTACHPTR **idx = (ATTACHPTR **) menu->data;
int y;
menu->redraw = REDRAW_INDEX | REDRAW_STATUS;
if (x == 0 && menu->max == 1)
{
mutt_error ("You may not delete the only attachment.");
idx[x]->content->tagged = 0;
return (-1);
}
for (y = 0; y < *idxlen; y++)
{
if (idx[y]->content->next == idx[x]->content)
{
idx[y]->content->next = idx[x]->content->next;
break;
}
}
idx[x]->content->next = NULL;
idx[x]->content->parts = NULL;
mutt_free_body (&(idx[x]->content));
safe_free ((void **) &idx[x]->tree);
safe_free ((void **) &idx[x]);
for (; x < *idxlen - 1; x++)
idx[x] = idx[x+1];
menu->max = --(*idxlen);
return (0);
}
/* return values:
*
* 1 message should be postponed
* 0 normal exit
* -1 abort message
*/
int mutt_send_menu (HEADER *msg, /* structure for new message */
char *fcc, /* where to save a copy of the message */
size_t fcclen,
HEADER *cur) /* current message */
{
char helpstr[SHORT_STRING];
char buf[LONG_STRING];
char fname[_POSIX_PATH_MAX];
MUTTMENU *menu;
BODY *tmp;
ATTACHPTR **idx = NULL;
short idxlen = 0;
short idxmax = 0;
int i;
int r = -1; /* return value */
int op = 0;
int loop = 1;
int fccSet = 0; /* has the user edited the Fcc: field ? */
idx = mutt_gen_attach_list (msg->content, &idxlen, &idxmax, 1);
menu = mutt_new_menu ();
menu->menu = MENU_COMPOSE;
menu->offset = HDR_ATTACH;
menu->max = idxlen;
menu->make_entry = snd_entry;
menu->tag = mutt_tag_attach;
menu->title = "Compose";
menu->data = idx;
helpstr[0] = 0;
mutt_make_help (buf, sizeof (buf), "Send ", MENU_COMPOSE, OP_COMPOSE_SEND_MESSAGE);
strcat (helpstr, buf);
mutt_make_help (buf, sizeof (buf), "Abort ", MENU_COMPOSE, OP_EXIT);
strcat (helpstr, buf);
mutt_make_help (buf, sizeof (buf), "To ", MENU_COMPOSE, OP_COMPOSE_EDIT_TO);
strcat (helpstr, buf);
mutt_make_help (buf, sizeof (buf), "CC ", MENU_COMPOSE, OP_COMPOSE_EDIT_CC);
strcat (helpstr, buf);
mutt_make_help (buf, sizeof (buf), "Subj ", MENU_COMPOSE, OP_COMPOSE_EDIT_SUBJECT);
strcat (helpstr, buf);
mutt_make_help (buf,